home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / kernel / mach / ds3100.md / machConst.h < prev    next >
C/C++ Source or Header  |  1992-12-18  |  14KB  |  422 lines

  1. /*
  2.  * machConst.h --
  3.  *
  4.  *    Machine dependent constants.
  5.  *
  6.  *    Copyright (C) 1989 Digital Equipment Corporation.
  7.  *    Permission to use, copy, modify, and distribute this software and
  8.  *    its documentation for any purpose and without fee is hereby granted,
  9.  *    provided that the above copyright notice appears in all copies.
  10.  *    Digital Equipment Corporation makes no representations about the
  11.  *    suitability of this software for any purpose.  It is provided "as is"
  12.  *    without express or implied warranty.
  13.  *
  14.  * $Header: /cdrom/src/kernel/Cvsroot/kernel/mach/ds3100.md/machConst.h,v 9.4 91/08/09 15:19:49 shirriff Exp $ SPRITE (DECWRL)
  15.  */
  16.  
  17. #ifndef _MACHCONST
  18. #define _MACHCONST
  19.  
  20. #ifdef KERNEL
  21. #include "vmPmaxConst.h"
  22. #else
  23. #include <kernel/vmPmaxConst.h>
  24. #endif
  25.  
  26. /*
  27.  * The bits in the cause register.
  28.  *
  29.  *    MACH_CR_BR_DELAY    Exception happened in branch delay slot.
  30.  *    MACH_CR_COP_ERR        Coprocessor error.
  31.  *    MACH_CR_INT_PENDING    Which hardware interrupt is pending.
  32.  *    MACH_CR_SOFT_INT    Which software interrupt is pending.
  33.  *    MACH_CR_EXC_CODE    The exception type (see exception codes below).
  34.  */
  35. #define MACH_CR_BR_DELAY    0x80000000
  36. #define MACH_CR_COP_ERR        0x30000000
  37. #define MACH_CR_INT_PENDING    0x0000FC00
  38. #define MACH_CR_SOFT_INT    0x00000300
  39. #define MACH_CR_EXC_CODE    0x0000003C
  40. #define MACH_CR_EXC_CODE_SHIFT    2
  41.  
  42. /*
  43.  * Shift to get to the hardware interrupt bits and the number of hardware
  44.  * interrupts.
  45.  */
  46. #define MACH_CR_HARD_INT_SHIFT        10
  47. #define MACH_NUM_HARD_INTERRUPTS    6
  48.  
  49. /*
  50.  * The different exception codes.
  51.  *
  52.  *    MACH_EXC_INT        Interrupt pending.
  53.  *    MACH_EXC_TLB_MOD    TLB modified fault.
  54.  *    MACH_EXC_TLB_LD_MISS    TLB miss on load or ifetch.
  55.  *    MACH_EXC_TLB_ST_MISS    TLB miss on a store.
  56.  *    MACH_EXC_ADDR_ERR_LD    An address error on a load or ifetch.
  57.  *    MACH_EXC_ADDR_ERR_ST    An address error on a store.
  58.  *    MACH_EXC_BUS_ERR_IFETCH    A bus error on an ifetch.
  59.  *    MACH_EXC_BUS_ERR_LD_ST    A bus error on a load or store.
  60.  *    MACH_EXC_SYSCALL    A system call.
  61.  *    MACH_EXC_BREAK        A breakpoint.
  62.  *    MACH_EXC_RES_INST    A reserved instruction exception.
  63.  *    MACH_EXC_COP_UNUSABLE    Coprocessor unusable.
  64.  *    MACH_EXC_OVFLOW        Arithmetic overflow.
  65.  */
  66. #define MACH_EXC_INT        0
  67. #define MACH_EXC_TLB_MOD    1
  68. #define MACH_EXC_TLB_LD_MISS    2
  69. #define MACH_EXC_TLB_ST_MISS    3
  70. #define MACH_EXC_ADDR_ERR_LD    4
  71. #define MACH_EXC_ADDR_ERR_ST    5
  72. #define MACH_EXC_BUS_ERR_IFETCH    6
  73. #define MACH_EXC_BUS_ERR_LD_ST    7
  74. #define MACH_EXC_SYSCALL    8
  75. #define MACH_EXC_BREAK        9
  76. #define MACH_EXC_RES_INST    10
  77. #define MACH_EXC_COP_UNUSABLE    11
  78. #define MACH_EXC_OVFLOW        12
  79. #define MACH_EXC_MAX        12
  80.  
  81. /*
  82.  * The bits in the status register.  All bits are active when set to 1.
  83.  *
  84.  *    MACH_SR_CO_USABILITY    Control the usability of the four coprocessors.
  85.  *    MACH_SR_BOOT_EXC_VEC    Use alternate exception vectors.
  86.  *    MACH_SR_TLB_SHUTDOWN    TLB disabled.
  87.  *    MACH_SR_PARITY_ERR    Parity error.
  88.  *    MACH_SR_CACHE_MISS    Most recent D-cache load resulted in a miss.
  89.  *    MACH_SR_PARITY_ZERO    Zero replaces outgoing parity bits.
  90.  *    MACH_SR_SWAP_CACHES    Swap I-cache and D-cache.
  91.  *    MACH_SR_ISOL_CACHES    Isolate D-cache from main memory.
  92.  *    MACH_SR_INT_MASK    Which of the 8 interrupts are enabled.
  93.  *    MACH_SR_KU_OLD        Old kernel/user mode bit. 1 => user mode.
  94.  *    MACH_SR_INT_ENA_OLD    Old interrupt enable bit.
  95.  *    MACH_SR_KU_PREV        Previous kernel/user mode bit. 1 => user mode.
  96.  *    MACH_SR_INT_ENA_PREV    Previous interrupt enable bit.
  97.  *    MACH_SR_KU_CUR        Current kernel/user mode bit. 1 => user mode.
  98.  *    MACH_SR_INT_ENA_CUR    Current interrupt enable bit.
  99.  */
  100. #define MACH_SR_COP_USABILITY    0xf0000000
  101. #define MACH_SR_COP_0_BIT    0x10000000
  102. #define MACH_SR_COP_1_BIT    0x20000000
  103. #define MACH_SR_BOOT_EXC_VEC    0x00400000
  104. #define MACH_SR_TLB_SHUTDOWN    0x00200000
  105. #define MACH_SR_PARITY_ERR    0x00100000
  106. #define MACH_SR_CACHE_MISS    0x00080000
  107. #define MACH_SR_PARITY_ZERO    0x00040000
  108. #define MACH_SR_SWAP_CACHES    0x00020000
  109. #define MACH_SR_ISOL_CACHES    0x00010000
  110. #define MACH_SR_INT_MASK    0x0000ff00
  111. #define MACH_SR_KU_OLD        0x00000020
  112. #define MACH_SR_INT_ENA_OLD    0x00000010
  113. #define MACH_SR_KU_PREV        0x00000008
  114. #define MACH_SR_INT_ENA_PREV    0x00000004
  115. #define MACH_SR_KU_CUR        0x00000002
  116. #define MACH_SR_INT_ENA_CUR    0x00000001
  117.  
  118. /*
  119.  * The interrupt masks.  If a bit in the mask is 1 then the interrupt is
  120.  * enabled.
  121.  */
  122. #define MACH_INT_MASK_5        0x8000
  123. #define MACH_INT_MASK_4        0x4000
  124. #define MACH_INT_MASK_3        0x2000
  125. #define MACH_INT_MASK_2        0x1000
  126. #define MACH_INT_MASK_1        0x0800
  127. #define MACH_INT_MASK_0        0x0400
  128. #define MACH_KERN_INT_MASK    0xfc00
  129. #define MACH_SOFT_INT_MASK_1    0x0200
  130. #define MACH_SOFT_INT_MASK_0    0x0100
  131. #define MACH_ALL_INT_ENABLED    0xff00
  132.  
  133. /*
  134.  * The system control status register.
  135.  */
  136. #define MACH_CSR_MONO        0x0800
  137. #define MACH_CSR_MEM_ERR    0x0400
  138. #define    MACH_CSR_VINT        0x0200
  139.  
  140. /*
  141.  * The bits in the context register.
  142.  */
  143. #define MACH_CNTXT_PTE_BASE    0xFFE00000
  144. #define MACH_CNTXT_BAD_VPN    0x001FFFFC
  145.  
  146. /*
  147.  * The fields in the processor revision identifier register.
  148.  */
  149. #define MACH_PRID_IMP        0x0000FF00
  150. #define MACH_PRID_REV        0x000000FF
  151.  
  152. /*
  153.  * Location of exception vectors.
  154.  */
  155. #define MACH_RESET_EXC_VEC    0xBFC00000
  156. #define MACH_UTLB_MISS_EXC_VEC    0x80000000
  157. #define MACH_GEN_EXC_VEC    0x80000080
  158.  
  159. /*
  160.  * Offsets of the fields in the Mach_State structure.
  161.  */
  162. #define    MACH_USER_PC_OFFSET        0
  163. #define MACH_TRAP_REGS_OFFSET        (MACH_USER_PC_OFFSET + 4)
  164. #define MACH_FP_REGS_OFFSET        (MACH_TRAP_REGS_OFFSET + (4 * MACH_NUM_GPRS))
  165. #define    MACH_FP_SR_OFFSET        (MACH_FP_REGS_OFFSET + (4 * MACH_NUM_FPRS))
  166. #define MACH_TRAP_MULT_LO_OFFSET    (MACH_FP_SR_OFFSET + 4)
  167. #define MACH_TRAP_MULT_HI_OFFSET    (MACH_TRAP_MULT_LO_OFFSET + 4)
  168. #define MACH_TRAP_UNIX_RET_VAL_OFFSET    (MACH_TRAP_MULT_HI_OFFSET + 4)
  169. #define    MACH_SWITCH_REGS_OFFSET        (MACH_TRAP_UNIX_RET_VAL_OFFSET + 16)
  170. #define    MACH_KERN_STACK_START_OFFSET    (MACH_SWITCH_REGS_OFFSET + (4 * MACH_NUM_GPRS) + (4 * MACH_NUM_FPRS) + 4 + 8)
  171. #define MACH_KERN_STACK_END_OFFSET    (MACH_KERN_STACK_START_OFFSET + 4)
  172. #define    MACH_SSTEP_INST_OFFSET        (MACH_KERN_STACK_END_OFFSET + 4)
  173. #define MACH_TLB_HIGH_ENTRY_OFFSET    (MACH_SSTEP_INST_OFFSET + 4)
  174.  
  175. #define MACH_TRAP_UNIX_ERRNO_OFFSET    0
  176.  
  177. /*
  178.  * Constants for setting up the TLB entries.  This code depends
  179.  * implictly upon MACH_KERN_STACK_PAGES.
  180.  */
  181. #define MACH_TLB_LOW_ENTRY_1_OFFSET    (MACH_TLB_HIGH_ENTRY_OFFSET + 4)
  182. #define MACH_TLB_LOW_ENTRY_2_OFFSET    (MACH_TLB_LOW_ENTRY_1_OFFSET + 4)
  183. #define MACH_TLB_LOW_ENTRY_3_OFFSET    (MACH_TLB_LOW_ENTRY_2_OFFSET + 4)
  184. #define MACH_STATE_SIZE            (MACH_TLB_LOW_ENTRY_3_OFFSET + 4)
  185.  
  186. /*
  187.  * Offsets into the debug state struct.
  188.  */
  189. #define MACH_DEBUG_REGS_OFFSET        0
  190. #define MACH_DEBUG_FP_REGS_OFFSET    (MACH_NUM_GPRS * 4)
  191. #define MACH_DEBUG_SIG_OFFSET        (MACH_DEBUG_FP_REGS_OFFSET + MACH_NUM_FPRS * 4)
  192. #define MACH_DEBUG_EXC_PC_OFFSET    (MACH_DEBUG_SIG_OFFSET + 32 * 4)
  193. #define MACH_DEBUG_CAUSE_REG_OFFSET    (MACH_DEBUG_EXC_PC_OFFSET + 4)
  194. #define MACH_DEBUG_MULT_HI_OFFSET    (MACH_DEBUG_CAUSE_REG_OFFSET + 4)
  195. #define MACH_DEBUG_MULT_LO_OFFSET    (MACH_DEBUG_MULT_HI_OFFSET + 4)
  196. #define MACH_DEBUG_FPC_CSR_REG_OFFSET    (MACH_DEBUG_MULT_LO_OFFSET + 4)
  197. #define MACH_DEBUG_FPC_EIR_REG_OFFSET    (MACH_DEBUG_FPC_CSR_REG_OFFSET + 4)
  198. #define MACH_DEBUG_TRAP_CAUSE_OFFSET    (MACH_DEBUG_FPC_EIR_REG_OFFSET + 4)
  199. #define MACH_DEBUG_TRAP_INFO_OFFSET    (MACH_DEBUG_TRAP_CAUSE_OFFSET + 4)
  200. #define    MACH_DEBUG_TLB_INDEX_OFFSET    (MACH_DEBUG_TRAP_INFO_OFFSET + 4)
  201. #define MACH_DEBUG_TLB_RANDOM_OFFSET    (MACH_DEBUG_TLB_INDEX_OFFSET + 4)
  202. #define MACH_DEBUG_TLB_LOW_OFFSET    (MACH_DEBUG_TLB_RANDOM_OFFSET + 4)
  203. #define MACH_DEBUG_TLB_CONTEXT_OFFSET    (MACH_DEBUG_TLB_LOW_OFFSET + 4)
  204. #define MACH_DEBUG_BAD_VADDR_OFFSET    (MACH_DEBUG_TLB_CONTEXT_OFFSET + 4)
  205. #define MACH_DEBUG_TLB_HI_OFFSET    (MACH_DEBUG_BAD_VADDR_OFFSET + 4)
  206. #define MACH_DEBUG_STATUS_REG_OFFSET    (MACH_DEBUG_TLB_HI_OFFSET + 4)
  207.  
  208. /*
  209.  * Coprocessor 0 registers:
  210.  *
  211.  *    MACH_COP_0_TLB_INDEX    TLB index.
  212.  *    MACH_COP_0_TLB_RANDOM    TLB random.
  213.  *    MACH_COP_0_TLB_LOW    TLB entry low.
  214.  *    MACH_COP_0_TLB_CONTEXT    TLB context.
  215.  *    MACH_COP_0_BAD_VADDR    Bad virtual address.
  216.  *    MACH_COP_0_TLB_HI    TLB entry high.
  217.  *    MACH_COP_0_STATUS_REG    Status register.
  218.  *    MACH_COP_0_CAUSE_REG    Exception cause register.
  219.  *    MACH_COP_0_EXC_PC    Exception PC.
  220.  *    MACH_COP_0_PRID        Processor revision identifier.
  221.  */
  222. #define MACH_COP_0_TLB_INDEX    $0
  223. #define MACH_COP_0_TLB_RANDOM    $1
  224. #define MACH_COP_0_TLB_LOW    $2
  225. #define MACH_COP_0_TLB_CONTEXT    $4
  226. #define MACH_COP_0_BAD_VADDR    $8
  227. #define MACH_COP_0_TLB_HI    $10
  228. #define MACH_COP_0_STATUS_REG    $12
  229. #define MACH_COP_0_CAUSE_REG    $13
  230. #define MACH_COP_0_EXC_PC    $14
  231. #define MACH_COP_0_PRID        $15
  232.  
  233. /*
  234.  * Return codes from Mach_Trap.
  235.  *
  236.  *   MACH_OK        The trap was handled successfully.
  237.  *   MACH_KERN_ERROR    The trap could not be handled so the debugger must be
  238.  *            called.
  239.  *   MACH_USER_ERROR    A cross address space copy to/from user space failed
  240.  *            because of a bad address.
  241.  */
  242. #define    MACH_OK            0
  243. #define    MACH_KERN_ERROR        1
  244. #define    MACH_USER_ERROR        2
  245.  
  246. /*
  247.  * Values for the code field in a break instruction.
  248.  */
  249. #define MACH_BREAK_CODE_FIELD    0x03ffffc0
  250. #define    MACH_BREAKPOINT_VAL    0
  251. #define MACH_SIG_RET_VAL    0x00010000
  252. #define MACH_SSTEP_VAL        0x00020000
  253.  
  254. /*
  255.  * Constants to differentiate between a breakpoint trap and all others.
  256.  */
  257. #define MACH_OTHER_TRAP_TYPE    0
  258. #define MACH_BRKPT_TRAP        1
  259.  
  260. /*
  261.  * MACH_KERN_START    The address where the kernel image is loaded at.
  262.  * MACH_CODE_START    The address where the kernel code is loaded at.
  263.  * MACH_STACK_BOTTOM    The address of the bottom of the kernel stack for the
  264.  *            main process that is initially run.
  265.  * MACH_KERN_END    The address where the last kernel virtual address is
  266.  *            at.
  267.  * MACH_KERN_STACK_PAGES Number of pages in a kernel stack.  This is used
  268.  *            to allocate TLB entries.  There are some
  269.  *            hard-coded dependencies on this as well, so
  270.  *            grep for MACH_KERN_STACK_PAGES in *.[cs].  The
  271.  *            last page is not mapped, so there should be
  272.  *            MACH_KERN_STACK_PAGES-1 tlb low entries, etc.
  273.  * MACH_KERN_STACK_SIZE Number of bytes in a kernel stack.
  274.  * MACH_BARE_STACK_OFFSET    Offset of where a bare kernel stack starts.
  275.  *                It doesn't start at the very top because
  276.  *                the debugger requires a couple of integers
  277.  *                of padding on the top.
  278.  * MAGIC        A magic number which is pushed onto the stack before
  279.  *            a context switch.  Used to verify that the stack
  280.  *            doesn't get trashed.
  281.  */
  282. #define    MACH_KERN_START        0x80000000
  283. #define    MACH_CODE_START        0x80030000
  284. #define    MACH_KERN_STACK_PAGES    4
  285. #define    MACH_KERN_STACK_SIZE    (MACH_KERN_STACK_PAGES * VMMACH_PAGE_SIZE)
  286. #define    MACH_STACK_BOTTOM    (MACH_CODE_START - MACH_KERN_STACK_SIZE)
  287. #define MACH_KERN_END        (VMMACH_VIRT_CACHED_START + 128 * 1024 * 1024)
  288. #define    MACH_BARE_STACK_OFFSET    (MACH_KERN_STACK_SIZE - 8)
  289. #define    MAGIC            0xFeedBabe
  290.  
  291. /*
  292.  * Constants for the user's address space.
  293.  *
  294.  * MACH_FIRST_USER_ADDR        The lowest possible address in the user's VAS.
  295.  * MACH_LAST_USER_ADDR        The highest possible address in the user's VAS.
  296.  * MACH_LAST_USER_STACK_PAGE    The highest page in the user stack segment.
  297.  * MACH_MAX_USER_STACK_ADDR    The highest value that the user stack pointer
  298.  *                can have.  Note that the stack pointer must be
  299.  *                decremented before anything can be stored on
  300.  *                the stack.
  301.  */
  302. #define    MACH_FIRST_USER_ADDR        VMMACH_PAGE_SIZE
  303. #define    MACH_LAST_USER_ADDR        (MACH_MAX_USER_STACK_ADDR - 1)
  304. #define    MACH_LAST_USER_STACK_PAGE    (VMMACH_USER_MAPPING_BASE_PAGE - VMMACH_USER_SHARED_PAGES- 1)
  305. #define    MACH_MAX_USER_STACK_ADDR    (VMMACH_USER_MAPPING_BASE_ADDR - VMMACH_USER_SHARED_PAGES*VMMACH_PAGE_SIZE)
  306.  
  307. /*
  308.  * Maximum number of processors configurable.
  309.  */
  310. #define    MACH_MAX_NUM_PROCESSORS        1
  311.  
  312. /*
  313.  * The number of general purpose and floating point registers.
  314.  */
  315. #define    MACH_NUM_GPRS    32
  316. #define    MACH_NUM_FPRS    32
  317.  
  318. /*
  319.  * The indices of all of the registers in the standard 32 register array.
  320.  */
  321. #define ZERO    0
  322. #define AST    1
  323. #define V0    2
  324. #define V1    3
  325. #define A0    4
  326. #define A1    5
  327. #define A2    6
  328. #define A3    7
  329. #define T0    8
  330. #define T1    9
  331. #define T2    10
  332. #define T3    11
  333. #define T4    12
  334. #define T5    13
  335. #define T6    14
  336. #define T7    15
  337. #define S0    16
  338. #define S1    17
  339. #define S2    18
  340. #define S3    19
  341. #define S4    20
  342. #define S5    21
  343. #define S6    22
  344. #define S7    23
  345. #define T8    24
  346. #define T9    25
  347. #define K0    26
  348. #define K1    27
  349. #define GP    28
  350. #define SP    29
  351. #define S8    30
  352. #define RA    31
  353.  
  354. /*
  355.  * Magic number for system calls to differentiate between Sprite and UNIX
  356.  * system calls.
  357.  */
  358. #define MACH_SYSCALL_MAGIC    0xbab1fade
  359.  
  360. /*
  361.  * Mininum and maximum cache sizes.
  362.  */
  363. #define MACH_MIN_CACHE_SIZE    (16 * 1024)
  364. #define MACH_MAX_CACHE_SIZE    (64 * 1024)
  365.  
  366. /*
  367.  * The floating point status register.
  368.  */
  369. #define    MACH_FPC_CSR    $31
  370.  
  371. /*
  372.  * Indices in the TLB where we store the stack TLB entries.
  373.  * This is implicitly dependent on MACH_KERN_STACK_PAGES and must
  374.  * have MACH_KERN_STACK_PAGES-1 defines, used in machAsm.s.
  375.  */
  376. #define MACH_STACK_TLB_INDEX_1    0x100
  377. #define MACH_STACK_TLB_INDEX_2    0x200
  378. #define MACH_STACK_TLB_INDEX_3    0x300
  379.  
  380. /*
  381.  * The standard amount of space that we have to leave on a stack frame when
  382.  * we create it.
  383.  */
  384. #define MACH_STAND_FRAME_SIZE    24
  385.  
  386. /*
  387.  * The floating point coprocessor status register bits.
  388.  */
  389. #define MACH_FPC_ROUNDING_BITS        0x00000003
  390. #define MACH_FPC_STICKY_BITS        0x0000007c
  391. #define MACH_FPC_TRAP_ENABLE_BITS    0x00000f80
  392. #define MACH_FPC_EXCEPTION_BITS        0x0003f000
  393. #define MACH_FPC_COND_BIT        0x00800000
  394.  
  395. /*
  396.  * UNIX signal numbers to translate into Sprite signal numbers and codes.
  397.  * This is so I can steal the code for softfp.
  398.  */
  399. #define MACH_SIGFPE        1
  400. #define MACH_SIGILL        2
  401.  
  402. /*
  403.  * Constants to determine if have a floating point instruction.
  404.  */
  405. #define MACH_OPCODE_SHIFT    26
  406. #define MACH_OPCODE_C1        0x11
  407.  
  408. /*
  409.  * Special UNIX system calls.
  410.  */
  411. #define MACH_UNIX_SIG_RETURN        103
  412. #define MACH_UNIX_LONG_JUMP_RETURN    139
  413. #define MACH_MAX_UNIX_SYSCALL           171
  414.  
  415. /*
  416.  * offset of unix errno in proc control block
  417.  */
  418.  
  419. #define MACH_UNIX_ERRNO_OFFSET 696 
  420.  
  421. #endif /* _MACHCONST */
  422.